home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / ms_dos / cd_lib / src / cdr_info.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-07-08  |  1.8 KB  |  74 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <dos.h>
  4. #include "define.h"
  5.  
  6. /* コンパクト情報の読み取り */
  7. /*
  8.  * decice_no:   device number (Towns CD-ROM -> 0)
  9.  * cd_type:     1 -> CD-DA, 2 -> data, 3 -> CD-DA+data
  10.  * start_track: 先頭トラック(曲)番号
  11.  * end_track:   最終トラック(曲)番号
  12.  * struct TIMEADRS {
  13.  *     char   min;
  14.  *     char   sec;
  15.  *     char   frame;
  16.  * } *track_times,  各トラック毎の演奏時間(最大99曲分必要)
  17.  * *disk_all_time; ディスク内の演奏時間
  18.  * 曲の最後まで演奏する場合は,終了時間にディスク内演奏時間-1を設定する.
  19.  * return: 0 -> 正常終了, 0以外 -> エラー
  20.  */
  21. int cdr_cdinfo(int device_no, int *cd_type, int *start_track, int *end_track,
  22.               struct TIMEADRS track_times[], struct TIMEADRS *disk_all_time)
  23. {
  24.     union REGS reg;
  25.     struct SREGS seg;
  26.     char buf[303];        /* buffer of Table Of Contents */
  27.     char *p;            /* pointer to buf */
  28.     int i;
  29.     
  30.     reg.h.ah = 0x54;
  31.     reg.h.al = (0xC0 | (u_char) device_no);
  32.     reg.x.cx = 0x0000;
  33.     
  34.     reg.x.di = (u_int) buf;
  35.     segread(&seg);
  36.     seg.ds = seg.ss;
  37.  
  38.     int86x(0x93, ®, ®, &seg);
  39.     
  40.     if (reg.h.ah == 0) {
  41.         if (cd_type) {
  42.             *cd_type = buf[0];
  43.         }
  44.         if (start_track) {
  45.             *start_track = buf[1];
  46.         }
  47.         if (end_track) {
  48.             *end_track = buf[2];
  49.         }
  50.         if (disk_all_time) {
  51.             disk_all_time->min = buf[3];
  52.             disk_all_time->sec = buf[4];
  53.             disk_all_time->frame = buf[5];
  54.         }
  55.         p = buf + 6;
  56.         if (track_times) {
  57.             for (i = 0; i <= *end_track - *start_track; i++) {
  58.                 track_times[i].min = p[0];
  59.                 track_times[i].sec = p[1];
  60.                 track_times[i].frame = p[2];
  61.                 p += 3;
  62.             }
  63.         }
  64.         return 0;
  65.     } else if (reg.h.ah == 0x02) {    /* device number error */
  66.         return DEVERR;
  67.     } else if (reg.h.ah == 0x10) {    /* cd-da plaing */
  68.         return DEVPLY;
  69.     } else {                          /* (reg.h.ah == 0x80) hard ware error */
  70.         return reg.x.cx;
  71.     }
  72. }
  73.  
  74.